<?php

class UsersController extends AppController {

    var $name = 'Users';
    var $helpers = array('Html', 'Form', 'Javascript');
    var $uses = array('User');
    var $components = array('Auth');

    function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow(array('login')); //son las acciones que permitis que sean accesibles sin estar logueado
        // Limito que si ya esta conectado, no pueda entrar a loguearse de nuevo
        if (in_array($this->action, array('login')) and $this->Auth->user('id')) {
            $this->redirect(array('user' => false, 'controller' => 'articles', 'action' => 'inicio'));
        }

        //si no es un usuario con nivel = 1 no lo dejo acceder a las siguientes funciones de este controlador
        if (in_array($this->action, array('index', 'add', 'edit', 'delete', 'view', 'contrasenia')) and $this->Auth->user('id') and $this->Auth->user('level') != 1) {
            $this->redirect(array('user' => false, 'controller' => 'articles', 'action' => 'inicio'));
        }
    }

    function login() {

        $this->layout = 'login';
        if ($this->Auth->user()) {
            $status = $this->Auth->user('status');

            if ($status == 'inactivo') {
                $this->Session->setFlash(__('Este usuario se encuentra desactivado. Ante cualquier duda comunícate con nuestro equipo de soporte.', true));
                $this->redirect(array('controller' => 'users', 'action' => 'logout'));
            }
            if ($status == 'pendiente') {
                $this->Session->setFlash(__('Este usuario esta pendiente de activación. Ante cualquier duda comunícate con nuestro equipo de soporte.', true));
                $this->redirect(array('controller' => 'users', 'action' => 'logout'));
            }

            //Se actualiza la ultima fecha con que se loguea el usuario
            $id = $this->Auth->user('id');

            //me traigo al usuario logueado y le actualizo el valor el valor de la ultima fecha de logueo y tambien la ip
            $usuario = $this->User->read(null, $id);
            $usuario['User']['last_login'] = date('Y-m-d H:i:s');

            $this->User->save($usuario);

            $this->redirect(array('controller' => 'articles', 'action' => 'inicio'));
        }
//            $this->redirect(array('controller' => 'articles', 'action' => 'inicio'));
    }

    function logout() {
        $this->redirect($this->Auth->logout());
        $this->redirect(array('controller' => 'users', 'action' => 'login'));
    }

    function index() {
        $this->User->recursive = 0;
        $this->paginate['order'] = array('User.last_name' => 'ASC');
        $this->set('users', $this->paginate());
    }
    
    function view($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Usuario invalido', true));
            $this->redirect(array('action' => 'index'));
        }
        $this->set('user', $this->User->read(null, $id));
    }
    
//    function add() { //Funciona pero no muestra los msj de validacion.
//        //empiezo una transaccion
//        $this->User->query('SET AUTOCOMMIT = 0;');
//        $this->User->query('START TRANSACTION;');
//        $bandera = true; //la uso para ver si algo salio mal
//        
//        if (!empty($this->data)) {
//            $datos = $this->data;
//            $this->User->create();
////            pr($datos);die;
//            
//            $datos['User']['level'] = $datos['User']['level'] +1;
//            $datos['User']['status'] = $datos['User']['status'] +1;
//            $datos['User']['created'] = date('Y-m-d H:i:s');
////            pr($datos);die;
//            if(!empty ($datos['User']['password']) and !empty($datos['User']['password_confirm'])){
//                if ($datos['User']['password'] == $this->Auth->password($datos['User']['password_confirm'])) {
//                    $this->User->save($datos);
//                    $bandera=true;
//                } else {
//                    $bandera=false;
//                    $this->Session->setFlash(__('Las contraseñas deben ser iguales.', true));
//                }
//            }else{
//                $bandera=false;
//            }
//            
//            if ($bandera) {
//                $this->User->query('COMMIT;');
//                $this->User->query('SET AUTOCOMMIT = 1;');
//                $this->redirect(array('action' => 'index'));
//            } else {//si hubo algun error hago un ROLLBACK deshaciendo todas estas consultas
//                $this->User->query('ROLLBACK;');
//                $this->User->query('SET AUTOCOMMIT = 1;');
//                $this->Session->setFlash(__('El usuario no se pudo guardar. Por favor, inténtelo de nuevo.', true));
//            }
//        }
//        
//    }

    function add() {
        if (!empty($this->data)) {
            $datos = $this->data;
            $this->User->create();
            if ($datos['User']['password'] == $this->Auth->password($datos['User']['password_confirm'])) {
                $datos['User']['level'] = $datos['User']['level'] +1;
                $datos['User']['status'] = $datos['User']['status'] +1;
                $datos['User']['created'] = date('Y-m-d H:i:s');
                //Para borrar un elemento de un array, x ejemplo 'password_confirm' se usa: unset($datos['User']['password_confirm']);
//                pr($datos);die;
                if($this->User->save($datos)){
                    $this->redirect(array('action' => 'index'));
                }else{
                    $this->Session->setFlash(__('El usuario no pudo ser guardado..', true));
                }
            } else {
                $this->Session->setFlash(__('Las contraseñas deben ser iguales.', true));
            }
        }
    }
    
    function edit($id = null) {
        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Usuario invalido', true));
            $this->redirect(array('action' => 'index'));
        }

        if (!empty($this->data)) {
            $datos = $this->data;
            $aux_user = $this->User->read(null, $datos['User']['id']);
            //controlo que un usuario de nivel 1 no pueda editar los datos de otro usuario de nivel 1
            if ($this->Auth->user('level') == 1 && $aux_user['User']['level'] == 1 && $this->Auth->user('id') != $id) {
                $this->Session->setFlash(__('No puede editar los datos de otro Usuario de tipo Admin.', true));
                $this->redirect($this->referer());
            }

            if ($datos['User']['level'] == 0) {
                $datos['User']['level'] = '1';
            } else {
                if ($datos['User']['level'] == 1) {
                    $datos['User']['level'] = '2';
                } else {
                    $datos['User']['level'] = '3';
                }
            }

            if ($datos['User']['status'] == 0) {
                $datos['User']['status'] = 'activo';
            } else {
                if ($datos['User']['status'] == 1) {
                    $datos['User']['status'] = 'inactivo';
                } else {
                    $datos['User']['status'] = 'pendiente';
                }
            }
            list($d, $m, $a) = explode("/", $datos['User']['created']);
            $fecha_aux = $a . "-" . $m . "-" . $d;
            $datos['User']['created'] = $fecha_aux;
            $fecha_actual = date('Y-m-d');
            if($fecha_aux <= $fecha_actual){
                if ($this->User->save($datos)) {
                    $aux_user2 = $this->User->read(null, $this->User->id);
    //				$this->Session->setFlash(__('El usuario fue guardado.', true));
                    if (($this->Auth->user('id') == $aux_user2['User']['id']) and ($this->Auth->user('level') != $aux_user2['User']['level'])){
                        $this->Session->setFlash(__('Su permiso ha cambiado. Vuelva a iniciar sesion.', true));
                        $this->redirect(array('controller' => 'users', 'action' => 'logout'));
                    }else{
                        $this->redirect(array('action' => 'index'));
                    }
                } else {
                    $this->Session->setFlash(__('El usuario no fue guardado. Verifique que la fecha de Creado sea menor que la fecha actual.', true));
                }
            }else {
                    $this->Session->setFlash(__('El usuario no fue guardado. Verifique que la fecha de Creado sea menor que la fecha actual.', true));
            }
        }
        if (empty($this->data)) {
            $this->data = $this->User->read(null, $id);
            //controlo que un usuario de nivel 1 no pueda editar los datos de otro usuario de nivel 1
            if ($this->Auth->user('level') == 1 && $this->data['User']['level'] == 1 && $this->Auth->user('id') != $id) {
                $this->Session->setFlash(__('No puede editar los datos de otro Usuario de tipo Admin.', true));
                $this->redirect($this->referer());
            }

            $this->data['User']['created'] = date('d/m/Y', strtotime($this->data['User']['created']));
            $this->data['User']['level'] = $this->data['User']['level'] - 1;
            if ($this->data['User']['status'] == 'activo') {
                $this->data['User']['status'] = 0;
            } else {
                if ($this->data['User']['status'] == 'inactivo') {
                    $this->data['User']['status'] = 1;
                } else {
                    $this->data['User']['status'] = 2;
                }
            }
        }
    }

    function contrasenia($id = null) {
        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Usuario invalido', true));
            $this->redirect(array('action' => 'index'));
        }

        if (!empty($this->data)) {
            $datos = $this->data;
            $aux_user = $this->User->read(null, $id);
            //controlo que un usuario de nivel 1 no pueda editar los datos de otro usuario de nivel 1
            if ($this->Auth->user('level') == 1 && $aux_user['User']['level'] == 1 && $this->Auth->user('id') != $id) {
                $this->Session->setFlash(__('No puedas editar los datos de otro Usuario de tipo Admin.', true));
                $this->redirect($this->referer());
            }
            if ($this->data['User']['new_password'] == $this->data['User']['new_password_confirm']) {
                $aux = $this->User->find('first', array('conditions' => array('User.id' => $id)));
                $aux['User']['password'] = $this->Auth->password($this->data['User']['new_password']);
                $this->User->save($aux);
//				$this->Session->setFlash(__('El usuario fue guardado.', true));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('El usuario no fue guardado. Por favor, intente de nuevo.', true));
            }
        }
        if (empty($this->data)) {
            $this->data = $this->User->read(null, $id);
            //controlo que un usuario de nivel 1 no pueda editar los datos de otro usuario de nivel 1
            if ($this->Auth->user('level') == 1 && $this->data['User']['level'] == 1 && $this->Auth->user('id') != $id) {
                $this->Session->setFlash(__('No puede editar los datos de otro Usuario de tipo Admin.', true));
                $this->redirect($this->referer());
            }
        }
    }

    function delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Usuario invalido', true));
            $this->redirect(array('action' => 'index'));
        }

        $aux_user = $this->User->read(null, $id);
        //controlo que un usuario de nivel 1 no pueda eliminar a otro usuario de nivel 1
        if ($this->Auth->user('level') == 1 && $aux_user['User']['level'] == 1 && $this->Auth->user('id') != $id) {
            $this->Session->setFlash(__('No puede editar los datos de otro Usuario de tipo Admin.', true));
            $this->redirect($this->referer());
        }
        $cant_admin = $this->User->find('list', array('conditions' => array('User.level' => '1')));
//        pr($cant_admin);die;
        if($this->Auth->user('id') == $id){
            if((sizeof($cant_admin) - 1) >= 1){
                if ($this->User->delete($id)) {
                    $this->Session->setFlash(__('El usuario fue eliminado', true));
                    if($aux_user['User']['id'] == $this->Auth->user('id')){
                        $this->redirect(array('action' => 'logout'));
                    }else{
                        $this->redirect(array('action' => 'index'));
                    }
                }
            }else{
                $this->Session->setFlash(__('No es posible eliminar el usuario porque el sistema se quedara sin administrador', true));
            }
        }else{
            if ($this->User->delete($id)) {
                    $this->Session->setFlash(__('El usuario fue eliminado', true));
                    if($aux_user['User']['id'] == $this->Auth->user('id')){
                        $this->redirect(array('action' => 'logout'));
                    }else{
                        $this->redirect(array('action' => 'index'));
                    }
                }
        }
        $this->Session->setFlash(__('El usuario no fue eliminado', true));
        $this->redirect(array('action' => 'index'));
    }
    /**
     * Función que realiza un backup de la base de datos, es llamada por ajax
     */
    function backup(){}
    
    function create_backup() {

        //borro todo el contenido de la carpeta de los backups
        exec('del /q C:\xampp\htdocs\cerrajeria\app\webroot\files\mysql_backup\*', $salida);

        $nombre_archivo = date("Y-m-d-H-i-s") . '.zip';
        $backupFile = "C:\\xampp\\htdocs\\cerrajeria\\app\\webroot\\files\\mysql_backup\\backup_cerrajeria_" . $nombre_archivo;

        $command = "C:\\xampp\\mysql\\bin\\mysqldump.exe --opt --user=root cerrajeria | zip > $backupFile";
        exec($command, $salida);

        $dir_file = SITE_URL . '/files/mysql_backup/backup_cerrajeria_' . $nombre_archivo;
        echo $dir_file;
        die;
    }
    
    /**
     * Función que restaura el backup subido por el usuario
     */
    function restore_backup() {

        if (!empty($this->data)) {
            //si vienen datos del formulario
            if ($_FILES['data']['error']['User']['archivo'] == 0) {
                //si se tomo bien el archivo

                $dir_file = $_FILES['data']['tmp_name']['User']['archivo'];

                //descomprimo el archivo
                $command = "unzip $dir_file -d C:\\xampp\\htdocs\\cerrajeria\\app\\webroot\\files\\mysql_backup";
                exec($command, $salida1);

                //lo copio y le cambio el nombre para ponerle la extension .sql
                $command = "copy C:\\xampp\\htdocs\\cerrajeria\\app\\webroot\\files\\mysql_backup\\- C:\\xampp\\htdocs\\cerrajeria\\app\\webroot\\files\\mysql_backup\\backup.sql";
                exec($command, $salida2);

                //ahora lo importo en la base de datos pisando todos los datos
                $command = "C:\\xampp\\mysql\\bin\\mysql.exe --user=root cerrajeria < C:\\xampp\\htdocs\\cerrajeria\\app\\webroot\\files\\mysql_backup\\backup.sql";
                exec($command, $salida3);

                if ($salida3) {
                    $this->Session->setFlash(__('El Backup no pudo ser restaurado. Por favor, intente nuevamente.', true));
                } else {
                    $this->Session->setFlash(__('El Backup ha sido restaurado.', true));
                }
            } else {
                $this->Session->setFlash(__('El archivo no se subió correctamente. Por favor, intente nuevamente.', true));
            }
        }
    }
}